package com.enen.utils;

/**
 * CurrentHolder 类用于在当前线程中存储和管理员工 ID。
 * 它利用 ThreadLocal 类来确保每个线程都有自己独立的员工 ID 副本，
 * 避免了多线程环境下的数据共享问题，提高了线程安全性。
 */
public class CurrentHolder {

    /**
     * 静态常量 CURRENT_LOCAL 是一个 ThreadLocal 实例，用于存储 Integer 类型的员工 ID。
     * ThreadLocal 为每个使用该变量的线程都提供一个独立的变量副本，
     * 每个线程都可以独立地改变自己的副本，而不会影响其他线程所对应的副本。
     */
    private static final ThreadLocal<Integer> CURRENT_LOCAL = new ThreadLocal<>();

    /**
     * setCurrentId 方法用于将传入的员工 ID 存储到当前线程的 ThreadLocal 实例中。
     *
     * @param employeeId 要存储的员工 ID，类型为 Integer。
     *                   当传入 null 时，ThreadLocal 会将当前线程对应的副本值设置为 null。
     */
    public static void setCurrentId(Integer employeeId) {
        // 调用 ThreadLocal 的 set 方法，将传入的员工 ID 存储到当前线程的副本中
        CURRENT_LOCAL.set(employeeId);
    }

    /**
     * getCurrentId 方法用于获取当前线程中存储的员工 ID。
     *
     * @return 当前线程中存储的员工 ID，如果当前线程没有存储员工 ID，则返回 null。
     */
    public static Integer getCurrentId() {
        // 调用 ThreadLocal 的 get 方法，获取当前线程中存储的员工 ID
        return CURRENT_LOCAL.get();
    }

    /**
     * remove 方法用于移除当前线程中存储的员工 ID。
     * 调用该方法后，当前线程的 ThreadLocal 副本将被清空，
     * 后续调用 getCurrentId 方法将返回 null。
     * 建议在使用完 ThreadLocal 后调用此方法，避免内存泄漏。
     */
    public static void remove() {
        // 调用 ThreadLocal 的 remove 方法，移除当前线程中存储的员工 ID
        CURRENT_LOCAL.remove();
    }
}